package com.ruoyi.common.utils;


import com.ruoyi.common.utils.file.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author ywh
 * @date 2020/12/29
 * @desc  分片上传文件及合并
 */
public class ChunkFilesUntil {
    /**
     *
     * @param file    分片文件
     * @param filePath   临时保存路径
     * @param guid       唯一标识
     * @param chunk     分片索引
     * @return
     */
    public static String uploadBurstFile(MultipartFile file, String filePath, String guid, int chunk) {
        try {
            // 临时目录用来存放所有分片文件
            String tempFileDir = filePath + guid;
            File parentFileDir = new File(tempFileDir);
            if (!parentFileDir.exists()) {
                parentFileDir.mkdirs();
            }
            // 分片处理时，前台会多次调用上传接口，每次都会上传文件的一部分到后台
            File tempPartFile = new File(parentFileDir, guid + "_" + chunk + ".part");
            FileUtils.copyInputStreamToFile(file.getInputStream(), tempPartFile);
            return "ok";
        } catch (Exception e) {
            e.printStackTrace();
            return "fail";
        }
    }

    /**
     *
     * @param guid   唯一标识
     * @param donePath  下载后的文件路径
     * @param fileName  保存的文件名称
     */
    public static void mergeBurstFile(String guid,String donePath, String fileName) {
        try {
            String nowDate = DateUtils.dateTimeNow();
            File parentFileDir = new File(donePath + guid);
            if (parentFileDir.isDirectory()) {
                File destTempFile = new File(donePath + nowDate, fileName);
                //先得到文件的上级目录，并创建上级目录，在创建文件,
                if (!destTempFile.getParentFile().exists()) {
                    destTempFile.getParentFile().mkdir();
                }
                if (!destTempFile.exists()) {
                    try {
                        //创建文件
                        destTempFile.createNewFile(); //上级目录没有创建，这里会报错
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(parentFileDir.listFiles().length);
                for (int i = 0; i < parentFileDir.listFiles().length - 1; i++) {
                    File partFile = new File(parentFileDir, guid + "_" + i + ".part");
                    FileOutputStream destTempfos = new FileOutputStream(destTempFile, true);
                    //遍历"所有分片文件"到"最终文件"中
                    FileUtils.copyFile(partFile, destTempfos);
                    destTempfos.close();
                }
                // 删除临时目录中的分片文件
                FileUtils.deleteDirectory(parentFileDir);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ;
    }

}
